#pragma once
#include "Dispatcher.h"
#include <sys/epoll.h>
#include "EventLoop.h"

class EpollDispatcher : public Dispatcher { // 事件分发器: 包含6个函数指针, 具有检测功能
public:
	EpollDispatcher(EventLoop* evLoop);
	virtual ~EpollDispatcher();

	// 将[_curChannel.fd]添加到epoll模型
	int add() override;
	// 将[_curChannel.fd]从epoll模型中删除, 并释放_curChannel所属的TcpConnection
	int remove() override;
	// 修改epoll模型中的[_curChannel.fd]的属性
	int modify() override;
	// 检测epoll模型上的[_curChannel.fd]是否被激活(是否有就绪事件), 阻塞等待timeout秒, 并处理就绪事件
	int dispatch(int timeout = 2) override;
private:
	// 让_curChannel在evLoop上执行op操作: 用于add、remove、modify
	int epollCtl(int op);

	int _epfd;					 // epoll模型
	struct epoll_event* _events; // 需要监视的事件
	const int _Max = 520;		 // epoll模型维护的epoll_event对象数组的容量
};